package com.ruoyi.common.utils;

import cn.hutool.core.date.DateUtil;

import java.util.Random;

public class NicknameUtils {

    /**
     * 生成一个随机且不重复的七位数昵称。
     *
     * @return 七位数昵称
     */
    public static String generateUniqueNickname() {
        char year = yearToLetter(DateUtil.thisYear());
        String yearStr = String.valueOf(year);
        int week = DateUtil.thisWeekOfYear();
        int weekDay = DateUtil.dayOfWeek(DateUtil.date());
        char hour = hourToLetter(DateUtil.hour(DateUtil.date(), true));
        String hourStr = String.valueOf(hour);
        int minute = DateUtil.minute(DateUtil.date()) / 10;
        int second = DateUtil.second(DateUtil.date()) / 10;
        String randomThreeDigits = generateThreeChars(3);
        return yearStr + week + weekDay + hourStr + minute + second + randomThreeDigits;
    }

    /**
     * 将给定的年份转换为英文字母。
     * 从2024年开始，'A' 表示2024年，'B' 表示2025年，以此类推。
     * 当到达'Z'时，再次从'A'开始循环。
     *
     * @param year 给定的年份
     * @return 相应的英文字母
     */
    public static char yearToLetter(int year) {
        // 假设'A'对应2024年
        final int BASE_YEAR = 2024;
        final int LETTER_A = 'A';
        final int NUM_LETTERS = 26; // 英文字母的数量

        // 计算自2024年以来经过了多少年，并取模26得到字母索引
        int letterIndex = (year - BASE_YEAR) % NUM_LETTERS;
        return (char) (LETTER_A + letterIndex);
    }

    /**
     * 将给定的年份转换为英文字母。
     * 从2024年开始，'A' 表示2024年，'B' 表示2025年，以此类推。
     * 当到达'Z'时，再次从'A'开始循环。
     *
     * @param year 给定的年份
     * @return 相应的英文字母
     */
    public static char hourToLetter(int year) {
        // 假设'A'对应2024年
        final int BASE_YEAR = 1;
        final int LETTER_A = 'A';
        final int NUM_LETTERS = 26; // 英文字母的数量

        // 计算自2024年以来经过了多少年，并取模26得到字母索引
        int letterIndex = (year - BASE_YEAR) % NUM_LETTERS;
        return (char) (LETTER_A + letterIndex);
    }

    /**
     * 随机生成三个字符，这些字符可以是大写字母A-Z或数字0-9。
     *
     * @return 一个长度为3的字符串，包含随机生成的字符。
     */
    public static String generateThreeChars(int length) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            // 生成0-35的随机数
            int randomNumber = random.nextInt(36);
            // 如果小于26，则为大写字母，否则为数字
            char resultChar;
            if (randomNumber < 26) {
                resultChar = (char) ('A' + randomNumber); // A-Z
            } else {
                resultChar = (char) ('0' + randomNumber - 26); // 0-9
            }
            sb.append(resultChar);
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i ++) {
            String s = generateUniqueNickname();
            System.out.println(s);
        }
    }

}
